import socket

# 创建一个TCP/IP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 下面这条语句就是解决这个重启server程序出现套接字地址只是用一次的错误的方法
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定套接字到本地地址和端口
server_address = ('localhost', 8888)
# 如果通过局域网进行测试，请关闭防火墙，不能使用localhost，应改为对应的局域网分配的IP地址
# server_address = ('192.168.0.104', 8888)
server_socket.bind(server_address)

# 开始监听传入的连接
server_socket.listen(1)

while True:
    # 等待连接
    print('等待连接...')
    client_socket, client_address = server_socket.accept() # 阻塞

    try:
        print('连接来自：', client_address)

        # 接收数据并发送回客户端
        while True:
            data = client_socket.recv(1024) # 等待数据包送达缓冲区
            print('接收到数据：', data.decode())
            if data:
                print('发送回客户端')
                client_socket.sendall(data)
            else: # 如果是客户端进程结束，四次挥手断开连接
                print('没有数据了，退出')
                break
    # 无论是否有异常，程序结束时，都会执行finally：
    finally:
        # 清理连接
        print("hello")
        client_socket.close() # 关闭套接字系统资源，不限于端口